package horariofacil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import horotimo.database.*;
import horotimo.database.Horotimo.TipoHorario;

public class DesSerializador {

	
	private static String imprimeData(Date dt) {
		DateFormat df = DateFormat.getInstance();
		String result = "null";
		if (dt != null) {
			result = df.format(dt);
		}
		return result;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		System.out.println("Args[0]..:" + args[0]);
		
		if (args.length > 1) {
			System.out.println("Args[1]..:" + args[1]);
		
			System.out.println("Args[2]..:" + args[2]);
		
			System.out.println("Args[3]..:" + args[3]);
		}
		
		String caminhoOrigem = "c:\\sat\\processamento\\horario_" + args[0] + ".ser";
		if (args.length > 1) {
			caminhoOrigem = args[1] + "\\horario_" + args[0] + ".ser";
		}
		
		String caminhoDestino = "c:\\sat\\processamento";
		if (args.length > 2) {
			caminhoDestino = args[2];
		}
		
		boolean exportarSolucoes = false;
		if (args.length > 3) {
			exportarSolucoes = true;
		}
		
		FileInputStream fis;
		ObjectInputStream ois;
		try {
			fis = new FileInputStream(caminhoOrigem);
			ois = new ObjectInputStream(fis);
			Horotimo hor = (Horotimo)ois.readObject();
			ois.close();

			PrintWriter pr = new PrintWriter(new File(caminhoDestino + "\\horario_" + args[0] + ".txt"), "ISO-8859-1");
			String strEmail = "";
			strEmail +=	"<horarioFacilID>" + hor.getId() + "</horarioFacilID>\r\n";

			if (hor.getTipoHorario() == null) {
				strEmail +=	"<TipoHorario>HORARIO_ESCOLAR_NORMAL</TipoHorario>\r\n";
			} else {
				if (hor.getTipoHorario().equals(TipoHorario.HORARIO_ESCOLAR_NORMAL)) {
					strEmail +=	"<TipoHorario>HORARIO_ESCOLAR_NORMAL</TipoHorario>\r\n";
				} else if (hor.getTipoHorario().equals(TipoHorario.TREINAMENTO)) {
					strEmail +=	"<TipoHorario>TREINAMENTO</TipoHorario>\r\n";
				} else {
					strEmail +=	"<TipoHorario>HORARIO_ESCOLAR_NORMAL</TipoHorario>\r\n";
				}
			}

			if (hor.getListParametrosProcessamento() == null || hor.getListParametrosProcessamento().size() == 0) {
				hor.setListParametrosProcessamento(ParametrosProcessamento.LISTA_PADRAO);
			}

			java.util.Collections.sort(hor.getListParametrosProcessamento(), new Comparator<ParametrosProcessamento>() {
				@Override
				public int compare(ParametrosProcessamento o1, ParametrosProcessamento o2) {
					return (o1.getOrdem() > o2.getOrdem()?1:0);
				}
			});

			strEmail += "<Numero_Parametros_Processamento>" + hor.getListParametrosProcessamento().size() + "</Numero_Parametros_Processamento>\r\n";
			for (int i = 0; i < hor.getListParametrosProcessamento().size(); i++) {
				strEmail += "<Parametros_Processamento_Ordem>" + hor.getListParametrosProcessamento().get(i).getOrdem() + "</Parametros_Processamento_Ordem>\r\n";
				strEmail += "<Parametros_Processamento_Funcionalidade>" + hor.getListParametrosProcessamento().get(i).getFuncionalidade() + "</Parametros_Processamento_Funcionalidade>\r\n";
				strEmail += "<Parametros_Processamento_Habilitado>" + hor.getListParametrosProcessamento().get(i).getHabilitado() + "</Parametros_Processamento_Habilitado>\r\n";
			}

			strEmail +=	"<NomeEscola>" + hor.getNomeEscola() + "</NomeEscola>\r\n";
			strEmail +=	"<AnoLetivo>" + hor.getAnoLetivo() + "</AnoLetivo>\r\n";
			strEmail +=	"<Periodo>" + hor.getPeriodo() + "</Periodo>\r\n";
			strEmail +=	"<InfoAdicional>" + hor.getInfoAdicional() + "</InfoAdicional>\r\n";
			strEmail +=	"<IdUsuario>" + hor.getIdUsuario() + "</IdUsuario>\r\n";
			strEmail += "<NumMaximoGeminadasGeral>" + hor.getNumMaximoGeminadas() + "</NumMaximoGeminadasGeral>\r\n";
			strEmail +=	"<MatrEtapaConcluida-0>" + hor.getMatrEtapaConcluida()[0] + "</MatrEtapaConcluida-0>\r\n";
			strEmail +=	"<MatrEtapaConcluida-1>" + hor.getMatrEtapaConcluida()[1] + "</MatrEtapaConcluida-1>\r\n";
			strEmail +=	"<MatrEtapaConcluida-2>" + hor.getMatrEtapaConcluida()[2] + "</MatrEtapaConcluida-2>\r\n";
			strEmail +=	"<MatrEtapaConcluida-3>" + hor.getMatrEtapaConcluida()[3] + "</MatrEtapaConcluida-3>\r\n";
			strEmail +=	"<MatrEtapaConcluida-4>" + hor.getMatrEtapaConcluida()[4] + "</MatrEtapaConcluida-4>\r\n";
			strEmail +=	"<MatrEtapaConcluida-5>" + hor.getMatrEtapaConcluida()[5] + "</MatrEtapaConcluida-5>\r\n";
			strEmail +=	"<MatrEtapaConcluida-6>" + hor.getMatrEtapaConcluida()[6] + "</MatrEtapaConcluida-6>\r\n";
			strEmail +=	"<Status>" + hor.getStatus() + "</Status>\r\n";
			strEmail +=	"<DataInicioProcessamento>" + imprimeData(hor.getDataInicioProcessamento()) + "</DataInicioProcessamento>\r\n";
			strEmail +=	"<DataFimProcessamento>" + imprimeData(hor.getDataFimProcessamento()) + "</DataFimProcessamento>\r\n";
			strEmail +=	"<UsuarioQueProcessou>" + hor.getUsuarioQueProcessou() + "</UsuarioQueProcessou>\r\n";
			strEmail +=	"<Processado>" + hor.getProcessado() + "</Processado>\r\n";
			strEmail +=	"<Browser>" + hor.getBrowser() + "</Browser>\r\n";
			strEmail +=	"<Data>" + imprimeData(hor.getDate()) + "</Data>\r\n";
			strEmail +=	"<Bloqueado>" + hor.getBloqueado() + "</Bloqueado>\r\n";

			//CONTADORSTAT
			strEmail += "<ContadorStat_NumGradesExcluidas>" + hor.getContadorStat().getNumGradesExcluidas() + "</ContadorStat_NumGradesExcluidas>\r\n";
			strEmail += "<ContadorStat_NumGradesIncluidas>" + hor.getContadorStat().getNumGradesIncluidas() + "</ContadorStat_NumGradesIncluidas>\r\n";
			strEmail += "<ContadorStat_NumGradesAlteradas>" + hor.getContadorStat().getNumGradesAlteradas() + "</ContadorStat_NumGradesAlteradas>\r\n";
			strEmail += "<ContadorStat_NumProcessamentos>" + hor.getContadorStat().getNumProcessamentos() + "</ContadorStat_NumProcessamentos>\r\n";

			MatrDisponibilidade[] matrDispGeral = hor.getMatrTempoIniFim();

			//MapSemana
			int s = 0;
			strEmail += "<NumeroSemanas>" + hor.getMapSemana().size() + "</NumeroSemanas>\r\n";
			for (Map.Entry<String, Semana> entry: hor.getMapSemana().entrySet()) {

				String nomeHashSemana = entry.getKey();
				Semana semana = entry.getValue();
				strEmail += "<Semana_" + s + "_NomeHashSemana>" + nomeHashSemana + "</Semana_" + s + "_NomeHashSemana>\r\n";

				strEmail += "<Semana_" + s + "_NumeroPeriodos>" + semana.getMatrPeriodo().size() + "</Semana_" + s + "_NumeroPeriodos>\r\n";
				for (int i = 0; i < semana.getMatrPeriodo().size(); i++) {
					Periodo p = semana.getMatrPeriodo().get(i);
					strEmail += "<Semana_" + s + "_Periodo_" + i + "_NomePeriodo>" + p.getNomePeriodo() + "</Semana_" + s + "_Periodo_" + i + "_NomePeriodo>\r\n";
					strEmail += "<Semana_" + s + "_Periodo_" + i + "_TempoAula>" + p.getTempoAula() + "</Semana_" + s + "_Periodo_" + i + "_TempoAula>\r\n";
					strEmail += "<Semana_" + s + "_Periodo_" + i + "_Ordem>" + p.getOrdem() + "</Semana_" + s + "_Periodo_" + i + "_Ordem>\r\n";
					strEmail += "<Semana_" + s + "_Periodo_" + i + "_NumIntervalos>" + p.getMatrIntervalo().size() + "</Semana_" + s + "_Periodo_" + i + "_NumIntervalos>\r\n";
					for (int j = 0; j < p.getMatrIntervalo().size(); j++) {
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_Intervalo_" + j + "_TempoIntervalo>" + p.getMatrIntervalo().get(j).getTempoInvervalo() + "</Semana_" + s + "_Periodo_" + i + "_Intervalo_" + j + "_TempoIntervalo>\r\n";
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_Intervalo_" + j + "_PosicaoIntervalo>" + p.getMatrIntervalo().get(j).getPosicaoIntervalo() + "</Semana_" + s + "_Periodo_" + i + "_Intervalo_" + j + "_PosicaoIntervalo>\r\n";
					}

					strEmail += "<Semana_" + s + "_Periodo_" + i + "_NumDiasSemana>" + p.getDiaSemana().size() + "</Semana_" + s + "_Periodo_" + i + "_NumDiasSemana>\r\n";
					for (int j = 0; j < p.getDiaSemana().size(); j++) {
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_NumeroDiaSemana_" + j + ">" + p.getDiaSemana().get(j).getNumeroDiaSemana() + "</Semana_" + s + "_Periodo_" + i + "_NumeroDiaSemana_" + j + ">\r\n"; 
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_NomeDiaSemana_" + j + ">" + p.getDiaSemana().get(j).getNomeDiaSemana() + "</Semana_" + s + "_Periodo_" + i + "_NomeDiaSemana_" + j + ">\r\n";	
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_NumeroHorariosSemana_" + j + ">" + p.getDiaSemana().get(j).getNumHorarios() + "</Semana_" + s + "_Periodo_" + i + "_NumeroHorariosSemana_" + j + ">\r\n";
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_TempoPrimeiroHorario_" + j + ">" + p.getDiaSemana().get(j).getTempoPrimeiroHorario() + "</Semana_" + s + "_Periodo_" + i + "_TempoPrimeiroHorario_" + j + ">\r\n";
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_Data_" + j + ">" + imprimeData(p.getDiaSemana().get(j).getDate()) + "</Semana_" + s + "_Periodo_" + i + "_Data_" + j + ">\r\n";
					}

					//Horarios do periodo
					MatrDisponibilidade[] matrDispPeriodo = p.getMatrTempoIniFim();
					strEmail += "<Semana_" + s + "_Periodo_" + i + "_NumHorariosPeriodo>" + matrDispPeriodo.length + "</Semana_" + s + "_Periodo_" + i + "_NumHorariosPeriodo>\r\n";
					for (int j = 0; j < matrDispPeriodo.length; j++) {
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_HorarioPeriodo_" + j + "_TempoIni>" + matrDispPeriodo[j].getTempoIni() + "</Semana_" + s + "_Periodo_" + i + "_HorarioPeriodo_" + j + "_TempoIni>\r\n";
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_HorarioPeriodo_" + j + "_TempoFim>" + matrDispPeriodo[j].getTempoFim() + "</Semana_" + s + "_Periodo_" + i + "_HorarioPeriodo_" + j + "_TempoFim>\r\n";

						int[] numHorarios = Horotimo.getNumHorario(matrDispGeral, matrDispPeriodo[j].getTempoIni(), matrDispPeriodo[j].getTempoFim());
						strEmail += "<Semana_" + s + "_Periodo_" + i + "_HorarioPeriodo_" + j + "_NumHorarios>" + numHorarios.length + "</Semana_" + s + "_Periodo_" + i + "_HorarioPeriodo_" + j + "_NumHorarios>\r\n";
						for (int k = 0; k < numHorarios.length; k++) {
							strEmail += "<Semana_" + s + "_Periodo_" + i + "_HorarioPeriodo_" + j + "_HorarioReal_" + k + ">" + numHorarios[k] + "</Semana_" + s + "_Periodo_" + i + "_HorarioPeriodo_" + j + "_HorarioReal_" + k + ">\r\n";
						}
					}
				}

				s++;
			}

			int numDiasSemana = hor.getNumDeDiasDaSemana();
			boolean[] matrExisteSemana = hor.getMatrExisteSemana();
			strEmail += "<NumDiasSemana>" + numDiasSemana + "</NumDiasSemana>\r\n";
			int iDiaSemana = 0;
			int numTotalHorariosSemana = hor.getTotalGradeHorarios();
			for (int i = 0; i < matrExisteSemana.length; i++) {
				if (matrExisteSemana[i]) {
					strEmail += "<NumeroDiaSemana_" + iDiaSemana + ">" + i + "</NumeroDiaSemana_" + iDiaSemana + ">\r\n"; 
					strEmail += "<NomeDiaSemana_" + iDiaSemana + ">" + DiaSemana.matrDiaSemana[i] + "</NomeDiaSemana_" + iDiaSemana + ">\r\n";	
					strEmail += "<NumeroHorariosSemana_" + iDiaSemana + ">" + numTotalHorariosSemana + "</NumeroHorariosSemana_" + iDiaSemana + ">\r\n";
					//strEmail += "<TempoPrimeiroHorario_" + iDiaSemana + ">" + hor.getSemana().getDiaSemana().get(i).getTempoPrimeiroHorario() + "</TempoPrimeiroHorario_" + iDiaSemana + ">\r\n";
					//strEmail += "<Data_" + iDiaSemana + ">" + imprimeData(hor.getSemana().getDiaSemana().get(i).getDate()) + "</Data_" + iDiaSemana + ">\r\n";
					iDiaSemana++;
				}
			}

			//Matriz de disponbilidade geral com os tempo de duracao de cada horario
			strEmail += "<NumeroHorarioDispGeral>" + numTotalHorariosSemana + "</NumeroHorarioDispGeral>\r\n";
			MatrDisponibilidade[] matrDisp = hor.getMatrTempoIniFim();
			for (int i = 0; i < matrDisp.length; i++) {
				strEmail += "<NumeroHorarioDispGeral_" + i + "_TempoIni>" + matrDisp[i].getTempoIni() + "</NumeroHorarioDispGeral_" + i + "_TempoIni>\r\n";
				strEmail += "<NumeroHorarioDispGeral_" + i + "_TempoFim>" + matrDisp[i].getTempoFim() + "</NumeroHorarioDispGeral_" + i + "_TempoFim>\r\n";
				strEmail += "<NumeroHorarioDispGeral_" + i + "_NomePeriodo>" + matrDisp[i].getNomePeriodo() + "</NumeroHorarioDispGeral_" + i + "_NomePeriodo>\r\n";
			}

			//HORARIOS VAGOS
			int numHorariosVagos = 0;
			String strHorariosVagos = "";
			int numHorariosGrade = hor.getTotalGradeHorarios();

			for (int i = 0; i < matrDisp.length; i++) {
				for (byte diaSemana = 0; diaSemana < 7; diaSemana++) {
					if (matrExisteSemana[diaSemana]) {
						if (!hor.existeHorario(diaSemana, matrDisp[i].getTempoIni(), matrDisp[i].getTempoFim())) {
							strHorariosVagos += "<HorariosVagos_" + numHorariosVagos + "_Dia>" + diaSemana + "</HorariosVagos_" + numHorariosVagos + "_Dia>\r\n";
							strHorariosVagos += "<HorariosVagos_" + numHorariosVagos + "_Horario>" + (i) + "</HorariosVagos_" + numHorariosVagos + "_Horario>\r\n";
							numHorariosVagos++;
						}
					}
				}
			}
			strEmail += "<HorariosVagos>" + numHorariosVagos + "</HorariosVagos>\r\n";
			strEmail += strHorariosVagos;

			strEmail += "<NumeroMaterias>" + hor.getMaterias().size() + "</NumeroMaterias>\r\n";
			for (int i = 0; i < hor.getMaterias().size(); i++) {
				strEmail += "<NomeMateria_" + i + ">" + hor.getMaterias().get(i).getNomeMateria() + "</NomeMateria_" + i + ">\r\n";
				strEmail += "<TipoMateria_" + i + ">" + hor.getMaterias().get(i).getTipo() + "</TipoMateria_" + i + ">\r\n";
				strEmail += "<CorHex_" + i + ">" + hor.getMaterias().get(i).getCorHex() + "</CorHex_" + i + ">\r\n";
				strEmail += "<NumMaximoGeminadas_" + i + ">" + hor.getMaterias().get(i).getNumMaximoGeminadas() + "</NumMaximoGeminadas_" + i + ">\r\n";
				strEmail += "<Date_" + i + ">" + imprimeData(hor.getMaterias().get(i).getDate()) + "</Date_" + i + ">\r\n";
			}

			//Locais
			if (hor.getLocais() == null || hor.getLocais().getNomeLocais() == null) {
				hor.setLocais(new Locais(new ArrayList<String>(0), new ArrayList<DistanciaLocais>(0)));
			}
			strEmail += "<NumeroDistanciasLocais>" + hor.getLocais().getDistanciaLocais().size() + "</NumeroDistanciasLocais>\r\n";
			for (int i = 0; i < hor.getLocais().getDistanciaLocais().size(); i++) {
				strEmail += "<NomeLocal1_" + i + ">" + hor.getLocais().getDistanciaLocais().get(i).getLocal1() + "</NomeLocal1_" + i + ">\r\n";
				strEmail += "<NomeLocal2_" + i + ">" + hor.getLocais().getDistanciaLocais().get(i).getLocal2() + "</NomeLocal2_" + i + ">\r\n";
				strEmail += "<Distancia_" + i + ">" + hor.getLocais().getDistanciaLocais().get(i).getDistancia() + "</Distancia_" + i + ">\r\n";
			}

			strEmail += "<NumeroSalas>" + hor.getSalas().size() + "</NumeroSalas>\r\n";
			for (int i = 0; i < hor.getSalas().size(); i++) {
				Sala sala = hor.getSalas().get(i);
				strEmail += "<NomeSala_" + i + ">" + sala.getNomeSala() + "</NomeSala_" + i + ">\r\n";
				strEmail += "<TipoSala_" + i + ">" + sala.getTipo() + "</TipoSala_" + i + ">\r\n";
				
				if (sala.getLocal() == null) {
					sala.setLocal("");
				}
				strEmail += "<LocalSala_" + i + ">" + sala.getLocal() + "</LocalSala_" + i + ">\r\n";

				strEmail += "<NomeSala_" + i + "_NomeHashSemana>" + sala.getNomeHashSemana() + "</NomeSala_" + i + "_NomeHashSemana>\r\n";

				strEmail += "<NomeSala_" + i + "_NumPeriodos>" + sala.getListPeriodos().size() + "</NomeSala_" + i + "_NumPeriodos>\r\n";
				for (int j = 0; j < sala.getListPeriodos().size(); j++) {
					strEmail += "<NomeSala_" + i + "_Periodo_" + j + ">" + sala.getListPeriodos().get(j) + "</NomeSala_" + i + "_Periodo_" + j + ">\r\n";
				}
				strEmail += "<NomeSala_" + i + "_NumMaximoGeminadas>" + sala.getNumMaximoGeminadas() + "</NomeSala_" + i + "_NumMaximoGeminadas>\r\n";
				strEmail += "<NomeSala_" + i + "_Data>" + imprimeData(sala.getDate()) + "</NomeSala_" + i + "_Data>\r\n";

				strEmail += "<NomeSala_" + i + "_Bloqueada>" + sala.getBloqueada() + "</NomeSala_" + i + "_Bloqueada>\r\n";
				strEmail += "<NomeSala_" + i + "_NumAulasAlocadasDesbloq>" + sala.getNumAulasAlocadasDesbloq() + "</NomeSala_" + i + "_NumAulasAlocadasDesbloq>\r\n";
				strEmail += "<NomeSala_" + i + "_NumGradesExcluidas>" + sala.getNumGradesExcluidas() + "</NomeSala_" + i + "_NumGradesExcluidas>\r\n";
				strEmail += "<NomeSala_" + i + "_NumGradesIncluidas>" + sala.getNumGradesIncluidas() + "</NomeSala_" + i + "_NumGradesIncluidas>\r\n";
				strEmail += "<NomeSala_" + i + "_NumGradesAlteradas>" + sala.getNumGradesAlteradas() + "</NomeSala_" + i + "_NumGradesAlteradas>\r\n";

				strEmail += "<NomeSala_" + i + "_NumGrades>" + sala.getGradeHoraria().size() + "</NomeSala_" + i + "_NumGrades>\r\n";
				for (int j = 0; j < sala.getGradeHoraria().size(); j++) {
					strEmail += "<NomeSala_" + i + "_NumGrades_" + j + "_NomeMateria>" + sala.getGradeHoraria().get(j).getNomeMateria() + "</NomeSala_" + i + "_NumGrades_" + j + "_NomeMateria>\r\n";
					strEmail += "<NomeSala_" + i + "_NumGrades_" + j + "_Quantidade>" + sala.getGradeHoraria().get(j).getQuantidade() + "</NomeSala_" + i + "_NumGrades_" + j + "_Quantidade>\r\n";
					strEmail += "<NomeSala_" + i + "_NumGrades_" + j + "_TempoAula>" + sala.getGradeHoraria().get(j).getTempoAulaUnitario() + "</NomeSala_" + i + "_NumGrades_" + j + "_TempoAula>\r\n";
					if (sala.getGradeHoraria().get(j).getNomeAmbiente() == null) {
						sala.getGradeHoraria().get(j).setNomeAmbiente("");
					}
					strEmail += "<NomeSala_" + i + "_NumGrades_" + j + "_Ambiente>" + hor.getSalas().get(i).getGradeHoraria().get(j).getNomeAmbiente() + "</NomeSala_" + i + "_NumGrades_" + j + "_Ambiente>\r\n";
				}

				System.out.println("sala = " + sala.getNomeSala());
				strEmail += "<NomeSala_" + i + "_NumDisponibilidades>" + sala.getNovaDisponibilidade().getListDisponibilidade().size() + "</NomeSala_" + i + "_NumDisponibilidades>\r\n";
				for (int k = 0; k < sala.getNovaDisponibilidade().getListDisponibilidade().size(); k ++) {
					DisponibilidadeDia dispDia = sala.getNovaDisponibilidade().getListDisponibilidade().get(k);
					strEmail += "<NomeSala_" + i + "_NumDisponibilidade_" + k + "_NumeroDiaSemana>" + dispDia.getDiaSemana() + "</NomeSala_" + i + "_NumDisponibilidade_" + k + "_NumeroDiaSemana>\r\n";
					strEmail += "<NomeSala_" + i + "_NumDisponibilidade_" + k + "_NumHorarios>" + dispDia.getMatrDisponibilidade().length + "</NomeSala_" + i + "_NumDisponibilidade_" + k + "_NumHorarios>\r\n";				
					for (int l = 0; l < dispDia.getMatrDisponibilidade().length; l++) {
						strEmail += "<NomeSala_" + i + "_NumDisponibilidade_" + k + "_NumeroDiaSemana_" + dispDia.getDiaSemana() + "_NumHorario_" + l + ">" + dispDia.getMatrDisponibilidade()[l] + "</NomeSala_" + i + "_NumDisponibilidade_" + k + "_NumeroDiaSemana_" + dispDia.getDiaSemana() + "_NumHorario_" + l + ">\r\n";
					}
				}
			}

			strEmail += "<EsquemaPrioridadeAlocacaoProfessores>" + hor.getEsquemaPrioridadeAlocacao() + "</EsquemaPrioridadeAlocacaoProfessores>\r\n";

			strEmail += "<NumeroProfessores>" + hor.getProfessores().size() + "</NumeroProfessores>\r\n";
			for (int i = 0; i < hor.getProfessores().size(); i++) {
				Professor prof = hor.getProfessores().get(i);

				strEmail += "<NomeProfessor_" + i + ">" + prof.getNomeProfessor() + "</NomeProfessor_" + i + ">\r\n";
				strEmail += "<NomeProfessor_" + i + "_NumMaximoGeminadas>" + prof.getNumMaximoGeminadas() + "</NomeProfessor_" + i + "_NumMaximoGeminadas>\r\n";
				strEmail += "<NomeProfessor_" + i + "_NumAulasLimiteSemana>" + prof.getNumAulasMaximoSemana() + "</NomeProfessor_" + i + "_NumAulasLimiteSemana>\r\n";
				strEmail += "<NomeProfessor_" + i + "_NumHorasLimiteSemana>" + prof.getNumHorasMaximoSemana() + "</NomeProfessor_" + i + "_NumHorasLimiteSemana>\r\n";
				strEmail += "<NomeProfessor_" + i + "_Email>" + prof.getEmail() + "</NomeProfessor_" + i + "_Email>\r\n";
				strEmail += "<NomeProfessor_" + i + "_PermitirAulaSimultanea>" + (prof.getPermitirAulasSimultaneas() == null?false:prof.getPermitirAulasSimultaneas()) + "</NomeProfessor_" + i + "_PermitirAulaSimultanea>\r\n";
				strEmail += "<NomeProfessor_" + i + "_PrioridadeEliminarJanelas>" + (prof.getPrioridadeProf() == null?1:prof.getPrioridadeProf()) + "</NomeProfessor_" + i + "_PrioridadeEliminarJanelas>\r\n";
				strEmail += "<NomeProfessor_" + i + "_Date>" + imprimeData(prof.getDate()) + "</NomeProfessor_" + i + "_Date>\r\n";

				if (prof.getReunioes() == null) {
					prof.setReunioes(new ArrayList<String>(0));
				}

				strEmail += "<NomeProfessor_" + i + "_NumMaterias>" + (prof.getMaterias().size()) + "</NomeProfessor_" + i + "_NumMaterias>\r\n";
				for (int j = 0; j < prof.getListMateriaProfessor().size(); j++) {
					strEmail += "<NomeProfessor_" + i + "_NumMateria_" + j + "_NomeMateria>" + prof.getListMateriaProfessor().get(j).getNomeMateria() + "</NomeProfessor_" + i + "_NumMateria_" + j + "_NomeMateria>\r\n";
					strEmail += "<NomeProfessor_" + i + "_NumMateria_" + j + "_NumAulasAtividade>" + prof.getListMateriaProfessor().get(j).getNumAulasAtividade() + "</NomeProfessor_" + i + "_NumMateria_" + j + "_NumAulasAtividade>\r\n";
					strEmail += "<NomeProfessor_" + i + "_NumMateria_" + j + "_AulaAtividadePercentual>" + prof.getListMateriaProfessor().get(j).getAulaAtividadePercentual() + "</NomeProfessor_" + i + "_NumMateria_" + j + "_AulaAtividadePercentual>\r\n";
					strEmail += "<NomeProfessor_" + i + "_NumMateria_" + j + "_TempoAulaAtividade>" + prof.getListMateriaProfessor().get(j).getTempoAulaAtividade() + "</NomeProfessor_" + i + "_NumMateria_" + j + "_TempoAulaAtividade>\r\n";
					strEmail += "<NomeProfessor_" + i + "_NumMateria_" + j + "_PrioridadeAlocacaoMateria>" + prof.getListMateriaProfessor().get(j).getPrioridadeAlocacao() + "</NomeProfessor_" + i + "_NumMateria_" + j + "_PrioridadeAlocacaoMateria>\r\n";
				}

				strEmail += "<NomeProfessor_" + i + "_NumReunioes>" + (prof.getReunioes().size()) + "</NomeProfessor_" + i + "_NumReunioes>\r\n";
				for (int j = 0; j < prof.getReunioes().size(); j++) {
					strEmail += "<NomeProfessor_" + i + "_NumMateria_" + j + "_NomeMateria>" + prof.getReunioes().get(j) + "</NomeProfessor_" + i + "_NumMateria_" + j + "_NomeMateria>\r\n";
					//strEmail += "<NomeProfessor_" + i + "_NumMateria_" + j + "_TipoMateria>Reuni�o</NomeProfessor_" + i + "_NumMateria_" + j + "_TipoMateria>\r\n";
				}

				strEmail += "<NomeProfessor_" + i + "_NumDisponibilidades>" + prof.getNovaDisponibilidade().getListDisponibilidade().size() + "</NomeProfessor_" + i + "_NumDisponibilidades>\r\n";
				for (int k = 0; k < prof.getNovaDisponibilidade().getListDisponibilidade().size(); k ++) {
					DisponibilidadeDia dispDia = prof.getNovaDisponibilidade().getListDisponibilidade().get(k);
					strEmail += "<NomeProfessor_" + i + "_NumDisponibilidade_" + k + "_NumeroDiaSemana>" + dispDia.getDiaSemana() + "</NomeProfessor_" + i + "_NumDisponibilidade_" + k + "_NumeroDiaSemana>\r\n";
					strEmail += "<NomeProfessor_" + i + "_NumDisponibilidade_" + k + "_NumHorarios>" + dispDia.getMatrDisponibilidade().length + "</NomeProfessor_" + i + "_NumDisponibilidade_" + k + "_NumHorarios>\r\n";				
					for (int l = 0; l < dispDia.getMatrDisponibilidade().length; l++) {
						strEmail += "<NomeProfessor_" + i + "_NumDisponibilidade_" + k + "_NumeroDiaSemana_" + dispDia.getDiaSemana() + "_NumHorario_" + l + ">" + dispDia.getMatrDisponibilidade()[l] + "</NomeProfessor_" + i + "_NumDisponibilidade_" + k + "_NumeroDiaSemana_" + dispDia.getDiaSemana() + "_NumHorario_" + l + ">\r\n";
					}
				}

				if (prof.getListAlocacaoFixaMateriaSalas() == null) {
					prof.setAlocacaoFixa(new ArrayList<AlocacaoFixaMateriaSala>(0));
				}

				if (prof.getListAlocacaoFixaMateriaSalas().size() > 0) {
					prof.setSalasObrigatorias(new String[0]);
				}

				if (prof.getSalasObrigatorias() == null) {
					prof.setSalasObrigatorias(new String[0]);
				}
				strEmail += "<NomeProfessor_" + i + "_SalasObrigatorias>" + prof.getSalasObrigatorias().length + "</NomeProfessor_" + i + "_SalasObrigatorias>\r\n";
				for (int k = 0; k < prof.getSalasObrigatorias().length; k ++) {
					strEmail += "<NomeProfessor_" + i + "_SalaObrigatoria_" + k + ">" + prof.getSalasObrigatorias()[k] + "</NomeProfessor_" + i + "_SalaObrigatoria_" + k + ">\r\n";
				}

				//Alocacao fixa
				strEmail += "<NomeProfessor_" + i + "_AlocacaoFixaProfMat>" + prof.getListAlocacaoFixaMateriaSalas().size() + "</NomeProfessor_" + i + "_AlocacaoFixaProfMat>\r\n";
				for (int k = 0; k < prof.getListAlocacaoFixaMateriaSalas().size(); k ++) {
					strEmail += "<NomeProfessor_" + i + "_AlocacaoFixaProfMat_" + k + "_NomeSala>" + prof.getListAlocacaoFixaMateriaSalas().get(k).getNomeSala() + "</NomeProfessor_" + i + "_AlocacaoFixaProfMat_" + k + "_NomeSala>\r\n";
					strEmail += "<NomeProfessor_" + i + "_AlocacaoFixaProfMat_" + k + "_NomeMateria>" + prof.getListAlocacaoFixaMateriaSalas().get(k).getNomeMateria() + "</NomeProfessor_" + i + "_AlocacaoFixaProfMat_" + k + "_NomeMateria>\r\n";
					strEmail += "<NomeProfessor_" + i + "_AlocacaoFixaProfMat_" + k + "_Obrigatorio>" + prof.getListAlocacaoFixaMateriaSalas().get(k).getObrigatorio() + "</NomeProfessor_" + i + "_AlocacaoFixaProfMat_" + k + "_Obrigatorio>\r\n";
				}

				if (prof.getNumFolgasSemana() == null) {
					prof.setNumFolgasSemana((byte)0);
				}

				if (prof.getPossiveisDiasFolgaSemana() == null) {
					prof.setPossiveisDiasFolgaSemana(new boolean[7]);
				}

				if (prof.getNumMaximoDeAulasNoDia() == null) {
					prof.setNumMaximoDeAulasNoDia(new byte[7]);
				}

				if (prof.getNumMaximoDeHorasNoDia() == null) {
					prof.setNumMaximoDeHorasNoDia(new int[7]);
				}

				strEmail += "<NomeProfessor_" + i + "_NumFolgasSemana>" + prof.getNumFolgasSemana() + "</NomeProfessor_" + i + "_NumFolgasSemana>\r\n";

				for (int k = 0; k < 7; k ++) {
					strEmail += "<NomeProfessor_" + i + "_PossivelFolgasSemana_" + k + ">" + prof.getPossiveisDiasFolgaSemana()[k] + "</NomeProfessor_" + i + "_PossivelFolgasSemana_" + k + ">\r\n";	
				}

				for (int k = 0; k < 7; k ++) {
					strEmail += "<NomeProfessor_" + i + "_LimiteDiario_" + k + "_NumAulas>" + prof.getNumMaximoDeAulasNoDia()[k] + "</NomeProfessor_" + i + "_LimiteDiario_" + k + "_NumAulas>\r\n";
					strEmail += "<NomeProfessor_" + i + "_LimiteDiario_" + k + "_NumHoras>" + prof.getNumMaximoDeHorasNoDia()[k] + "</NomeProfessor_" + i + "_LimiteDiario_" + k + "_NumHoras>\r\n";
				}
			}

			//Uniao de aulas (aulas simultaneas)
			strEmail += "<NumAulasSimultaneas>" + hor.getListAulaSimultanea().size() + "</NumAulasSimultaneas>\r\n";
			for (int i = 0; i < hor.getListAulaSimultanea().size(); i++) {
				strEmail += "<AulaSimultanea_" + i + "_Sala1>" + hor.getListAulaSimultanea().get(i).getSala1() + "</AulaSimultanea_" + i + "_Sala1>\r\n";
				strEmail += "<AulaSimultanea_" + i + "_Sala2>" + hor.getListAulaSimultanea().get(i).getSala2() + "</AulaSimultanea_" + i + "_Sala2>\r\n";
				strEmail += "<AulaSimultanea_" + i + "_Materia>" + hor.getListAulaSimultanea().get(i).getMateria() + "</AulaSimultanea_" + i + "_Materia>\r\n";
			}

			if (hor.getMapListHorariosFixo() == null) {
				hor.setMapListHorariosFixos(new HashMap<String, DetalheSolucao>(0));
			}

			strEmail += "<Num_HorariosFixos>" + hor.getMapListHorariosFixo().size() + "</Num_HorariosFixos>\r\n";
			Iterator<Map.Entry<String, DetalheSolucao>> i = hor.getMapListHorariosFixo().entrySet().iterator(); 
			//for (int i = 0; i < horAtual.getMapListHorariosFixo().size(); i++) {

			int c = 0;

			while (i.hasNext()) {
				Map.Entry<String, DetalheSolucao> entr = i.next();
				DetalheSolucao det = hor.getMapListHorariosFixo().get(entr.getKey()); 

				strEmail += "<HorariosFixo_" + c + "_Professor>" + det.getProfessor() + "</HorariosFixo_" + c + "_Professor>\r\n";
				strEmail += "<HorariosFixo_" + c + "_Materia>" + det.getMateria() + "</HorariosFixo_" + c + "_Materia>\r\n";
				strEmail += "<HorariosFixo_" + c + "_Sala>" + det.getSala() + "</HorariosFixo_" + c + "_Sala>\r\n";
				strEmail += "<HorariosFixo_" + c + "_Dia>" + det.getDia() + "</HorariosFixo_" + c + "_Dia>\r\n";
				strEmail += "<HorariosFixo_" + c + "_Horario>" + det.getHorario() + "</HorariosFixo_" + c + "_Horario>\r\n";
				strEmail += "<HorariosFixo_" + c + "_NumVariavel>" + det.getNumVariavel() + "</HorariosFixo_" + c + "_NumVariavel>\r\n";
				c++;
			}

			if (hor.getMapConfAulaGeminadaDetalhado() == null) {
				hor.setMapConfAulaGeminadaDetalhado(new HashMap<String, Integer>(0));
			}

			strEmail += "<Num_ConfGeminadasDetalhado>" + hor.getMapConfAulaGeminadaDetalhado().size() + "</Num_ConfGeminadasDetalhado>\r\n";
			int confCount = 0;
			for (Entry<String, Integer> entry: hor.getMapConfAulaGeminadaDetalhado().entrySet()) {
				String key = entry.getKey();
				String sala = key.substring(key.indexOf("|, S:") + 6, key.indexOf("|, M:")); 
				String prof = key.substring(3, key.indexOf("|, S:"));
				String mat = key.substring(key.indexOf("|, M:") + 6, key.indexOf("|."));
				strEmail += "<ConfGeminadaDet_" + confCount + "_Sala>" + sala + "</HorariosFixo_" + confCount + "_Sala>\r\n";
				strEmail += "<ConfGeminadaDet_" + confCount + "_Materia>" + mat + "</HorariosFixo_" + confCount + "_Materia>\r\n";
				strEmail += "<ConfGeminadaDet_" + confCount + "_Professor>" + prof + "</HorariosFixo_" + confCount + "_Professor>\r\n";
				strEmail += "<ConfGeminadaDet_" + confCount + "_NumMaximo>" + entry.getValue() + "</HorariosFixo_" + confCount + "_NumMaximo>\r\n";
			}

			if (!exportarSolucoes) {
				strEmail += "<NumSolucoes>0</NumSolucoes>\r\n";
			} else {
				strEmail += "<NumSolucoes>" + hor.getSolucoes().size() + "</NumSolucoes>\r\n";

				for (int z = 0; z < hor.getSolucoes().size(); z++) {
					strEmail += "<NumSolucoes_" + z + "_idHorario>" + (hor.getSolucoes().get(z).getIdHorario()==null?0:hor.getSolucoes().get(z).getIdHorario()) + "</NumSolucoes_" + z + "_idHorario>\r\n";
					strEmail += "<NumSolucoes_" + z + "_geradoPeloUsuario>" + (hor.getSolucoes().get(z).getGeradoPeloUsuario()==null?false:hor.getSolucoes().get(z).getGeradoPeloUsuario()) + "</NumSolucoes_" + z + "_geradoPeloUsuario>\r\n";
					strEmail += "<NumSolucoes_" + z + "_solucaoCompleta>" + (hor.getSolucoes().get(z).getSolucaoCompleta()==null?true:hor.getSolucoes().get(z).getSolucaoCompleta()) + "</NumSolucoes_" + z + "_solucaoCompleta>\r\n";
					strEmail += "<NumSolucoes_" + z + "_Data>" + imprimeData(hor.getSolucoes().get(z).getDate()) + "</NumSolucoes_" + z + "_Data>\r\n";
					strEmail += "<NumSolucoes_" + z + "_NumDetalhes>" + hor.getSolucoes().get(z).getDetSolucao().size() + "</NumSolucoes_" + z + "_NumDetalhes>\r\n";
					for (int j = 0; j < hor.getSolucoes().get(z).getDetSolucao().size(); j++) {
						strEmail += "<NumSolucoes_" + z + "_NumDetalhes_" + j + "_Materia>" + hor.getSolucoes().get(z).getDetSolucao().get(j).getMateria() + "</NumSolucoes_" + z + "_NumDetalhes_" + j + "_Materia>\r\n";
						strEmail += "<NumSolucoes_" + z + "_NumDetalhes_" + j + "_Professor>" + hor.getSolucoes().get(z).getDetSolucao().get(j).getProfessor() + "</NumSolucoes_" + z + "_NumDetalhes_" + j + "_Professor>\r\n";
						strEmail += "<NumSolucoes_" + z + "_NumDetalhes_" + j + "_Sala>" + hor.getSolucoes().get(z).getDetSolucao().get(j).getSala() + "</NumSolucoes_" + z + "_NumDetalhes_" + j + "_Sala>\r\n";
						strEmail += "<NumSolucoes_" + z + "_NumDetalhes_" + j + "_Dia>" + hor.getSolucoes().get(z).getDetSolucao().get(j).getDia() + "</NumSolucoes_" + z + "_NumDetalhes_" + j + "_Dia>\r\n";
						strEmail += "<NumSolucoes_" + z + "_NumDetalhes_" + j + "_Horario>" + hor.getSolucoes().get(z).getDetSolucao().get(j).getHorario() + "</NumSolucoes_" + z + "_NumDetalhes_" + j + "_Horario>\r\n";
						strEmail += "<NumSolucoes_" + z + "_NumDetalhes_" + j + "_Alocado>" + hor.getSolucoes().get(z).getDetSolucao().get(j).getAlocado() + "</NumSolucoes_" + z + "_NumDetalhes_" + j + "_Alocado>\r\n";
					}
				}
			}

			strEmail += "\r\n";
			pr.write(strEmail);
			pr.flush();
			pr.close();
			System.out.println("Exportado com sucesso!");

			PrintWriter pr2 = new PrintWriter(new File(caminhoDestino + "\\horarioPronto_" + args[0] + ".txt"), "ISO-8859-1");
			pr2.write(args[0]);
			pr2.flush();
			pr2.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}